﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AutomationTools.Procedimentos.Leitura;
using AutomationTools;
using System.IO;
using System.Collections;

namespace WebRequestToolsSample
{
    public partial class Form10 : Form
    {
        public Form10()
        {
            InitializeComponent();
        }

        private void Form10_Load(object sender, EventArgs e)
        {
            List<Matriz> ret = null;
            List<Matriz> matriz = new List<Matriz>();
            //foreach (var item in Directory.EnumerateFiles(@"Recursos\Renato Seg\Anexos", "*.xls"))
            //{

                var item = @"Recursos\Renato Seg\Matriz de Sistemas e Serviços BcSul.xlsx";

                ProcedimentoController pc = new ProcedimentoController(new IProcedimento[]{
                    new Excel<Matriz>(item, true)
                });

                ret = ((IEnumerable)pc.ExecutarProcedimentos()).Cast<Matriz>().ToList();
                foreach (var mitem in ret)
                {
                    if (!matriz.Contains(mitem))
                    {
                        matriz.Add(mitem);
                    }
                }

                var verticais = string.Join(Environment.NewLine, ret.GroupBy(x => x.Vertical).Select(x => x.Key).OrderBy(x => x).ToArray());
                var sistemas = string.Join(Environment.NewLine, ret.GroupBy(x => x.Sistema).Select(x => x.Key).OrderBy(x => x).Distinct().ToArray());
                var fornecedor = string.Join(Environment.NewLine, ret.GroupBy(x => x.Fornecedor).Select(x => x.Key).OrderBy(x => x).Distinct().ToArray());
                var localizacao = string.Join(Environment.NewLine, ret.GroupBy(x => x.Localizacao).Select(x => x.Key).OrderBy(x => x).Distinct().ToArray());
                var empresa = string.Join(Environment.NewLine, ret.GroupBy(x => x.Empresa).Select(x => x.Key).OrderBy(x => x).Distinct().ToArray());
                var areasGestoras = ret.GroupBy(x => x.AreaGestoradoSistema).Select(x => x.Key).Distinct().OrderBy(x => x).ToArray();
                var areasUsuarias = ret.GroupBy(x => x.Equipeeareasusuarias).Select(x => x.Key).Distinct().OrderBy(x => x).ToArray();
                var temp = areasGestoras.ToList();
                temp.AddRange(areasUsuarias);
                var areas = string.Join(Environment.NewLine, temp.Distinct().OrderBy(x => x).ToArray());
            //}

            var list = ret;

            StringBuilder sb = new StringBuilder();
            string patt = "{0}\t";
            foreach (var iteml in list)
            {
                sb.Append(string.Format(patt, iteml.Vertical.Trim()));
                sb.Append(string.Format(patt, iteml.Sistema.Trim()));
                sb.Append(string.Format(patt, iteml.Modulo.Trim()));
                sb.Append(string.Format(patt, iteml.Submodulo.Trim()));
                sb.Append(string.Format(patt, iteml.Fornecedor.Trim()));
                sb.Append(string.Format(patt, iteml.Localizacao.Trim()));
                sb.Append(string.Format(patt, iteml.Descricao.Trim()));
                sb.Append(string.Format(patt, iteml.Empresa.Trim()));
                sb.Append(string.Format(patt, iteml.AreaGestoradoSistema.Trim()));
                sb.Append(string.Format(patt, iteml.Equipeeareasusuarias.Trim()));
                sb.Append(string.Format(patt, iteml.Autorizantesdealteracoesnosistema.Trim()));
                sb.Append(string.Format(patt, iteml.ResponsavelProducao.Trim().Replace("/", ";")));
                sb.Append(string.Format(patt, iteml.ResponsavelDesenvolvimento.Trim()));
                sb.Append(string.Format(patt, iteml.Observacao.Trim()));

                sb.Append(Environment.NewLine);
            }
            File.WriteAllText("Recursos\\Matriz.csv", sb.ToString(), Encoding.GetEncoding("iso-8859-1"));
        }
    }


    [CanExcelParse("Matriz de Sistemas BcSul")]
    public class Matriz
    {

        [ExcelParse("A")]
        public string Vertical { get; set; }
        [ExcelParse("B")]
        public string Sistema { get; set; }
        [ExcelParse("C")]
        public string Modulo { get; set; }
        [ExcelParse("D")]
        public string Submodulo { get; set; }
        [ExcelParse("E")]
        public string Fornecedor { get; set; }
        [ExcelParse("F")]
        public string Localizacao { get; set; }
        [ExcelParse("G")]
        public string Descricao { get; set; }
        [ExcelParse("H")]
        public string Empresa { get; set; }
        [ExcelParse("I")]
        public string AreaGestoradoSistema { get; set; }
        [ExcelParse("J")]
        public string Equipeeareasusuarias { get; set; }
        [ExcelParse("K")]
        public string Autorizantesdealteracoesnosistema { get; set; }
        [ExcelParse("L")]
        public string ResponsavelProducao { get; set; }
        [ExcelParse("M")]
        public string ResponsavelDesenvolvimento { get; set; }
        [ExcelParse("N")]
        public string Observacao { get; set; }

        public override bool Equals(object obj)
        {
            if (obj is Matriz)
            {
                var m = (Matriz)obj;
                return this.Vertical == m.Vertical
                    && this.Submodulo == m.Submodulo
                    && this.Sistema == m.Sistema
                    && this.ResponsavelProducao == m.ResponsavelProducao
                    && this.ResponsavelDesenvolvimento == m.ResponsavelDesenvolvimento
                    && this.Observacao == m.Observacao
                    && this.Modulo == m.Modulo
                    && this.Localizacao == m.Localizacao
                    && this.Fornecedor == m.Fornecedor
                    && this.Empresa == m.Empresa
                    && this.Equipeeareasusuarias == m.Equipeeareasusuarias
                    && this.Descricao == m.Descricao
                    && this.Autorizantesdealteracoesnosistema == m.Autorizantesdealteracoesnosistema
                    && this.AreaGestoradoSistema == m.AreaGestoradoSistema;
            }
            else

                return base.Equals(obj);
        }

        public override int GetHashCode()
        {
            return base.GetHashCode();
        }

    }

}

